package GUI_Calculadora;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

import Calculadora.Calculadora;
import Calculadora.DivisionPorCero;

import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JTextField;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Font;
import java.awt.Image;
import javax.swing.SwingConstants;
import java.awt.Label;

/**
 * Modela la GUI de una calculadora con 4 operaciones: sumar, restar, multiplicar, dividir.
 * @author FJoaquin (federico.joaquin@cs.uns.edu.ar)
 *
 */
public class VentanaCalculadora extends JFrame {
	
	//Atributos de instancia de clase
	private JPanel contentPane;
	private JTextField operando1;
	private JTextField operando2;

	/**
	 * Método principal de la aplicación.
	 * Crea una instancia de VentanaCalculadora.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					VentanaCalculadora frame = new VentanaCalculadora();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Inicializa las componentes gráficas de la GUI.
	 */
	public VentanaCalculadora() {
		setResizable(false);
		setTitle("ED 2019 || Mini calculadora by F. Joaqu\u00EDn");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 529, 186);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JLabel lblMinicalculadoraestructurasDeDatos = new JLabel("Estructuras de Datos 2019");
		lblMinicalculadoraestructurasDeDatos.setHorizontalAlignment(SwingConstants.CENTER);
		lblMinicalculadoraestructurasDeDatos.setFont(new Font("Corbel", Font.BOLD | Font.ITALIC, 20));
		lblMinicalculadoraestructurasDeDatos.setBounds(116, 22, 250, 50);
		contentPane.add(lblMinicalculadoraestructurasDeDatos);
		
		JButton btnSumar = new JButton("Sumar");
		btnSumar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				float op1, op2, resultado;
				if (operandosValidos()) {
					op1 = Float.parseFloat(operando1.getText());
					op2 = Float.parseFloat(operando2.getText());
					resultado = Calculadora.sumar(op1, op2);
					JOptionPane.showMessageDialog(null, "El resultado de la operación suma es: " + resultado, "Información de operación", JOptionPane.INFORMATION_MESSAGE);
				}else {
					JOptionPane.showMessageDialog(null, "Alguno de los operandos ingresados son inválidos", "Error datos entrada", JOptionPane.WARNING_MESSAGE);
				}	
			}
		});
		btnSumar.setBounds(81, 125, 89, 23);
		contentPane.add(btnSumar);
		
		JButton btnRestar = new JButton("Restar");
		btnRestar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				float op1, op2, resultado;
				if (operandosValidos()) {
					op1 = Float.parseFloat(operando1.getText());
					op2 = Float.parseFloat(operando2.getText());
					resultado = Calculadora.restar(op1, op2);
					JOptionPane.showMessageDialog(null, "El resultado de la operación resta es: " + resultado, "Información de operación", JOptionPane.INFORMATION_MESSAGE);
				}else {
					JOptionPane.showMessageDialog(null, "Alguno de los operandos ingresados son inválidos", "Error datos entrada", JOptionPane.WARNING_MESSAGE);
				}	
			}
		});
		btnRestar.setBounds(180, 125, 89, 23);
		contentPane.add(btnRestar);
		
		JButton btnMultiplicar = new JButton("Multiplicar");
		btnMultiplicar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				float op1, op2, resultado;
				if (operandosValidos()) {
					op1 = Float.parseFloat(operando1.getText());
					op2 = Float.parseFloat(operando2.getText());
					resultado = Calculadora.multiplicar(op1, op2);
					JOptionPane.showMessageDialog(null, "El resultado de la operación multiplicar es: " + resultado, "Información de operación", JOptionPane.INFORMATION_MESSAGE);
				}else {
					JOptionPane.showMessageDialog(null, "Alguno de los operandos ingresados son inválidos", "Error datos entrada", JOptionPane.WARNING_MESSAGE);
				}	
			}
		});
		btnMultiplicar.setBounds(279, 125, 89, 23);
		contentPane.add(btnMultiplicar);
		
		JButton btnDividir = new JButton("Dividir");
		btnDividir.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				float op1, op2, resultado;
				if (operandosValidos()) {
					op1 = Float.parseFloat(operando1.getText());
					op2 = Float.parseFloat(operando2.getText());
					
					try {
						resultado = Calculadora.dividir(op1, op2);
						JOptionPane.showMessageDialog(null, "El resultado de la operación dividir es: " + resultado, "Información de operación", JOptionPane.INFORMATION_MESSAGE);
					} catch (DivisionPorCero e) {
						JOptionPane.showMessageDialog(null, "No se puede realizar una división por cero.", "Error datos entrada", JOptionPane.ERROR_MESSAGE);
					}
				}else {
					JOptionPane.showMessageDialog(null, "Alguno de los operandos ingresados son inválidos", "Error datos entrada", JOptionPane.WARNING_MESSAGE);
				}	
			}
		});		
		btnDividir.setBounds(378, 125, 89, 23);
		contentPane.add(btnDividir);
		
		operando1 = new JTextField();
		operando1.setBounds(186, 94, 86, 20);
		contentPane.add(operando1);
		operando1.setColumns(10);
		
		JLabel lblOperando = new JLabel("Operando 1:");
		lblOperando.setBounds(113, 97, 84, 14);
		contentPane.add(lblOperando);
		
		JLabel lblOperando_1 = new JLabel("Operando 2:");
		lblOperando_1.setBounds(282, 97, 84, 14);
		contentPane.add(lblOperando_1);
		
		operando2 = new JTextField();
		operando2.setBounds(353, 94, 86, 20);
		contentPane.add(operando2);
		operando2.setColumns(10);
		
		JLabel label = new JLabel("");
		ImageIcon iconoDCIC = new javax.swing.ImageIcon(getClass().getResource("/Imagenes/DCIC.png"));
		Image imagenDCIC = iconoDCIC.getImage();
        ImageIcon iconoDCICEscalado = new ImageIcon (imagenDCIC.getScaledInstance(50,50,Image.SCALE_SMOOTH));
		label.setIcon(iconoDCICEscalado);
        label.setBounds(56, 22, 50, 50);
		contentPane.add(label);
		
		JLabel label_1 = new JLabel("");
		ImageIcon iconoUNS = new javax.swing.ImageIcon(getClass().getResource("/Imagenes/UNS.png"));
		Image imagenUNS = iconoUNS.getImage();
        ImageIcon iconoUNSEscalado = new ImageIcon (imagenUNS.getScaledInstance(65,50,Image.SCALE_SMOOTH));
		label_1.setIcon(iconoUNSEscalado);
		label_1.setBounds(376, 18, 65, 50);
		contentPane.add(label_1);
		
		JLabel label_2 = new JLabel("");
		ImageIcon iconoCalc = new javax.swing.ImageIcon(getClass().getResource("/Imagenes/Calculadora.png"));
		Image imagenCalc = iconoCalc.getImage();
        ImageIcon iconoCALCEscalado = new ImageIcon (imagenCalc.getScaledInstance(50,50,Image.SCALE_SMOOTH));
		label_2.setIcon(iconoCALCEscalado);
		label_2.setBounds(21, 94, 50, 50);
		contentPane.add(label_2);
	}
	
	/**
	 * Cheque la correctitud de los operandos ingresados.
	 * @return True si los operandos ingresados son válidos, false en caso contrario.
	 */
	private boolean operandosValidos(){
		boolean toReturn = true;
		float aux;
		
		//Si no se ingresó el operando 1, el operando 2 o ambos, estos no son válidos
		if (operando1.getText().isEmpty() || operando2.getText().isEmpty())
			toReturn = false;
		else {
			//Valida que los operandos ingresados sean valores numéricos.
			try {
				aux = Float.parseFloat(operando1.getText());
				aux = Float.parseFloat(operando2.getText());
			//Si al intentar convertir el String a Float existe error de conversión, los operandos no son válidos.
			}catch(NumberFormatException e) {
				toReturn = false;
			}
		}
		return toReturn;
	}
}
